package main

import (
	"errors"
	"fmt"
	"math"
	"os"
)

/*
error接口介绍

error本质上是一个接口类型，其中包含一个Error()方法，错误值可以存储在变量中，通过函数返回。它必须是函数返回值的【最后一个值】。处理错误的方式通常是
将返回的错误与nil进行比较。nil值表示没有发生错误，而非nil值表示出现错误。如果不是nil，需打印输出错误。

如果有多个任务导致错误，可以使用 errors 的 Join 函数而不是手动管理数组，可见 microdemo 项目的 microdemo/restful/bff/internal/logic/getlogic.go 的 Get() 方法
*/
func main() {

	// 异常情况
	s := math.Sqrt(-100)
	fmt.Println(s)
	// 错误值存储在变量中，并通过函数返回，将返回的错误与nil进行比较
	f, err := Sara(0)
	if err == nil {
		fmt.Println(f)
	} else {
		fmt.Println(err)
	}
	open, err := os.Open("/xxxx.txt")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(open.Name(), "成功打开")
	}
}

/*
定义平方根运算函数
*/
func Sara(f float64) (float64, error) {

	if f < 0 {
		// errors.New() 创建error对象，返回值为错误的具体描述
		return 0, errors.New("负数不能进行平方根运算")
	} else if f == 0 {
		// fmt包下的Errorf()函数返回error对象，它本质上还是调用errors.New()
		return 0, fmt.Errorf("0的平方根就是自己，不用运算")
	} else {

		return math.Sqrt(f), nil
	}

}
